package com.sky.controller.admin;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sky.dto.AuditMerchantDTO;
import com.sky.dto.MerchantDTO;
import com.sky.dto.MerchantPageQueryDTO;
import com.sky.dto.MerchantUpdateDTO;
import com.sky.entity.MerchantCategory;
import com.sky.result.Result;
import com.sky.service.AdminMerchantService;
import com.sky.service.MerchantService;
import com.sky.service.OrderService;
import java.util.List;
import com.sky.vo.MerchantStatusCount;
import com.sky.vo.MerchantVO;
import com.sky.vo.OrderVO;
import com.sky.vo.PageResult;
import com.sky.vo.MerchantAccountVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Map;

/**
 * 商家管理控制器（后台管理功能）
 */
@RestController
@RequestMapping("/admin/merchant")
@Api(tags = "商家审核相关接口")
@Slf4j
public class AdminMerchantController {

    @Autowired
    private AdminMerchantService adminMerchantService;
    
    @Autowired
    private MerchantService merchantService;
    
    @Autowired
    private OrderService orderService;

    /**
     * 新增商家
     * @param merchantDTO 商家信息
     * @return 操作结果
     */
    @PostMapping
    @ApiOperation("新增商家")
    public Result<Map<String, Object>> addMerchant(@Valid @RequestBody MerchantDTO merchantDTO) {
        log.info("新增商家，参数：{}", merchantDTO);
        
        Map<String, Object> result = merchantService.addMerchant(merchantDTO);
        
        log.info("新增商家成功，ID：{}", result.get("id"));
        return Result.success(result);
    }
    
    /**
     * 获取所有商家列表
     * @param page 页码
     * @param pageSize 每页记录数
     * @param name 商家名称模糊搜索
     * @param username 联系电话模糊搜索
     * @param status 状态过滤
     * @return 分页结果
     */
    @GetMapping("/page")
    @ApiOperation("商家分页查询")
    public Result<PageResult<MerchantVO>> getAllMerchants(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String username,
            @RequestParam(required = false) String status) {
        log.info("获取所有商家列表，参数：page={}, pageSize={}, name={}, username={}, status={}",
                page, pageSize, name, username, status);

        MerchantPageQueryDTO queryDTO = new MerchantPageQueryDTO();
        queryDTO.setPage(page);
        queryDTO.setPageSize(pageSize);
        queryDTO.setName(name);
        queryDTO.setUsername(username);
        queryDTO.setStatus(status);
        
        PageResult<MerchantVO> pageResult = adminMerchantService.getAllMerchants(queryDTO);
        log.info("获取所有商家列表结果：{}", pageResult);
        return Result.success(pageResult);
    }
    


    /**
     * 审核商家（通过/拒绝）- 符合接口文档规范
     * @param auditMerchantDTO 审核信息
     * @return 操作结果
     */
    @PostMapping("/approve")
    @ApiOperation("审核商家（通过/拒绝）")
    public Result<String> approveMerchant(
            @Valid @RequestBody AuditMerchantDTO auditMerchantDTO) {
        log.info("审核商家，参数：{}", auditMerchantDTO);

        // 根据approved字段决定是通过还是拒绝
        String action = auditMerchantDTO.getApproved() ? "approve" : "reject";
        adminMerchantService.auditMerchant(action, auditMerchantDTO);

        String result = "审核成功，操作：" + (auditMerchantDTO.getApproved() ? "通过" : "拒绝");
        log.info(result);
        return Result.success(result);
    }

    /**
     * 审核商家（通过/拒绝）- 旧接口，为保持兼容性保留
     * @param auditMerchantDTO 审核信息
     * @return 操作结果
     */
    @PostMapping("/audit")
    @ApiOperation("商家审核操作（旧接口）")
    public Result<String> auditMerchant(
            @Valid @RequestBody AuditMerchantDTO auditMerchantDTO) {
        log.info("审核商家(旧接口)，参数：{}", auditMerchantDTO);

        // 根据approved字段决定是通过还是拒绝
        String action = auditMerchantDTO.getApproved() ? "approve" : "reject";
        adminMerchantService.auditMerchant(action, auditMerchantDTO);

        String result = "审核成功，操作：" + (auditMerchantDTO.getApproved() ? "通过" : "拒绝");
        log.info(result);
        return Result.success(result);
    }

    /**
     * 切换商家状态
     * @param id 商家ID
     * @param status 状态（true-启用，false-禁用）
     * @return 操作结果
     */
    @PutMapping("/status/{id}")
    @ApiOperation("切换商家状态")
    public Result<String> changeMerchantStatus(
            @PathVariable("id") Long id,
            @RequestParam Boolean status) {
        log.info("切换商家状态，参数：id={}, status={}", id, status);

        adminMerchantService.changeStatus(id, status);

        String result = status ? "商家已启用" : "商家已禁用";
        log.info(result);
        return Result.success(result);
    }
    
    /**
     * 更新商家营业状态
     * @param id 商家ID
     * @param businessStatus 营业状态
     * @return 操作结果
     */
    @PutMapping("/business-status/{id}")
    @ApiOperation("更新商家营业状态")
    public Result<String> updateBusinessStatus(
            @PathVariable("id") Long id,
            @RequestParam String businessStatus) {
        log.info("更新商家营业状态，参数：id={}, businessStatus={}", id, businessStatus);

        adminMerchantService.updateBusinessStatus(id, businessStatus);

        log.info("商家营业状态更新成功");
        return Result.success("商家营业状态更新成功");
    }
    
    /**
     * 更新商家信息
     * @param id 商家ID
     * @param merchantUpdateDTO 商家更新信息
     * @return 操作结果
     */
    @PutMapping("/{id}")
    @ApiOperation("更新商家信息")
    public Result<String> updateMerchant(
            @PathVariable("id") Long id,
            @RequestBody MerchantUpdateDTO merchantUpdateDTO) {
        log.info("更新商家信息，参数：id={}, merchantUpdateDTO={}", id, merchantUpdateDTO);

        merchantService.updateMerchant(id, merchantUpdateDTO);

        String result = "商家信息更新成功";
        log.info(result);
        return Result.success(result);
    }

    /**
     * 重新审核商家
     * @param auditMerchantDTO 商家ID
     * @return 操作结果
     */
    @PostMapping("/reaudit")
    @ApiOperation("重新审核商家")
    public Result<String> reauditMerchant(@Valid @RequestBody AuditMerchantDTO auditMerchantDTO) {
        log.info("重新审核商家，参数：{}", auditMerchantDTO);

        adminMerchantService.reauditMerchant(auditMerchantDTO.getId());

        log.info("重新审核成功，商家ID：{}", auditMerchantDTO.getId());
        return Result.success("重新审核成功");
    }

    /**
     * 查看商家详情
     * @param id 商家ID
     * @return 商家详情
     */
    @GetMapping("/detail")
    @ApiOperation("查看商家详情")
    public Result<MerchantVO> getMerchantDetail(@RequestParam Long id) {
        log.info("查看商家详情，参数：id={}", id);

        MerchantVO merchantVO = adminMerchantService.getMerchantDetail(id);

        log.info("商家详情查询结果：{}", merchantVO);
        return Result.success(merchantVO);
    }
    
    /**
     * 获取商家状态统计
     * @return 各状态商家数量
     */
    @GetMapping("/status/count")
    @ApiOperation("获取商家状态统计")
    public Result<MerchantStatusCount> getMerchantStatusCount() {
        log.info("获取商家状态统计");
        
        MerchantStatusCount statusCount = adminMerchantService.getMerchantStatusCount();
        
        log.info("商家状态统计结果：{}", statusCount);
        return Result.success(statusCount);
    }
    
    /**
     * 查看商家订单
     * @param id 商家ID
     * @param page 页码
     * @param pageSize 每页记录数
     * @return 商家订单列表
     */
    @GetMapping("/{id}/orders")
    @ApiOperation("查看商家订单")
    public Result<PageResult> getMerchantOrders(
            @PathVariable("id") Long id,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        log.info("查看商家订单，商家ID：{}, 页码：{}, 每页大小：{}", id, page, pageSize);
        
        // 调用服务层方法获取商家订单列表
        IPage<OrderVO> orderList = orderService.getOrdersByMerchantId(id, page, pageSize);
        
        // 转换为PageResult对象
        PageResult pageResult = new PageResult();
        pageResult.setTotal(orderList.getTotal());
        pageResult.setRecords(orderList.getRecords());
        
        log.info("获取商家订单列表成功，商家ID：{}, 总数：{}", id, orderList.getTotal());
        return Result.success(pageResult);
    }
    
    /**
     * 查看商家账户信息
     * @param id 商家ID
     * @return 商家账户信息
     */
    @GetMapping("/{id}/account")
    @ApiOperation("查看商家账户信息")
    public Result<MerchantAccountVO> getMerchantAccount(
            @PathVariable("id") Long id) {
        log.info("查看商家账户信息，商家ID：{}", id);
        
        // 调用服务层方法获取商家账户信息
        MerchantAccountVO merchantAccountVO = merchantService.getMerchantAccount(id);
        
        log.info("获取商家账户信息成功，商家ID：{}", id);
        return Result.success(merchantAccountVO);
    }
    
    /**
     * 删除商家
     * @param id 商家ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除商家")
    public Result<String> deleteMerchant(
            @PathVariable("id") Long id) {
        log.info("删除商家，商家ID：{}", id);
        
        merchantService.deleteMerchant(id);
        
        log.info("删除商家成功，商家ID：{}", id);
        return Result.success("删除商家成功");
    }
    
    /**
     * 获取所有商家分类
     * @return 分类列表
     */
    @GetMapping("/category/list")
    @ApiOperation("获取所有商家分类")
    public Result<List<MerchantCategory>> getAllMerchantCategories() {
        log.info("获取所有商家分类");
        List<MerchantCategory> categoryList = adminMerchantService.getAllMerchantCategories();
        return Result.success(categoryList);
    }
    
    /**
     * 根据ID获取商家分类
     * @param id 分类ID
     * @return 分类信息
     */
    @GetMapping("/category/getById")
    @ApiOperation("根据ID获取商家分类")
    public Result<MerchantCategory> getMerchantCategoryById(Long id) {
        log.info("根据ID获取商家分类: {}", id);
        MerchantCategory category = adminMerchantService.getMerchantCategoryById(id);
        return Result.success(category);
    }
}
